package org.app.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import org.app.entity.Activity;

import java.util.List;
import java.util.Map;

public interface ActivityService extends IService<Activity> {
    
    /**
     * 分页查询活动列表
     */
    Page<Activity> getActivityPage(Integer pageNum, Integer pageSize, Integer status);
    
    /**
     * 带关键词的分页查询活动列表
     */
    Page<Activity> getActivityPage(Integer pageNum, Integer pageSize, Integer status, String keyword);
    
    /**
     * 管理员分页查询活动列表
     */
    Page<Activity> getAdminActivityPage(Integer pageNum, Integer pageSize, Integer status);
    
    /**
     * 管理员带关键词分页查询活动列表
     */
    Page<Activity> getAdminActivityPage(Integer pageNum, Integer pageSize, Integer status, String keyword);
    
    /**
     * 用户报名活动
     */
    Boolean signup(Long activityId, Long userId);
    
    /**
     * 取消报名
     */
    void cancelSignup(Long activityId, Long userId);
    
    /**
     * 检查用户是否已报名
     */
    boolean isSignedUp(Long activityId, Long userId);
    
    /**
     * 获取活动参与者数量
     */
    int getParticipantCount(Long activityId);
    
    /**
     * 更新活动状态
     */
    void updateStatus(Long activityId, Integer status);
    
    /**
     * 获取活动参与者列表
     */
    List<Map<String, Object>> getActivityParticipants(Long activityId);
    
    /**
     * 获取活动统计信息
     */
    Map<String, Object> getActivityStats();
    
    /**
     * 获取用于首页轮播图的活动列表
     * @param limit 获取活动数量
     * @return 活动列表
     */
    List<Activity> getTopActivitiesForBanner(int limit);
    
    /**
     * 获取最近的活动列表（用于推荐）
     * @param limit 获取活动数量
     * @return 活动列表
     */
    List<Activity> getRecentActivities(int limit);
    
    /**
     * 自动更新活动状态
     * 根据当前时间自动更新活动状态：未开始->报名中->已结束
     */
    void autoUpdateActivityStatus();
    
    /**
     * 获取用户参与的活动列表
     * @param pageNum 页码
     * @param pageSize 每页大小
     * @param userId 用户ID
     * @return 分页结果
     */
    Page<Activity> getMyActivities(Integer pageNum, Integer pageSize, Long userId);
} 